package com.sddfp.log.entity;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author yellow Doctor
 * @date 2025-06-26
 * @desc 蜗牛创想：www.woniuxy.com
 */
public class MyRule extends AbstractLoadBalancerRule {

    // 使用 AtomicInteger 实现简单的轮询计数器
    // 线程安全的统计
    private final AtomicInteger nextServerCyclicCounter = new AtomicInteger(0);

    @Override
    public Server choose(Object key) {
        return choose(getLoadBalancer(), key);
    }

    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        }

        // 192.168.101 : 9000    1
        // 192.168.101 : 9001    1
        // 192.168.101 : 9002    3
        //进行choose 操作
        List<Server> reachableServers = lb.getReachableServers(); // 获取所有可用实例

        if (reachableServers.isEmpty()) {
            return null; // 无可用实例
        }
        int upCount = 0;
        for (Server server : reachableServers) {
            if (server.isAlive()) {
                upCount++;  //判断或者的服务器
            }
        }
        if (upCount == 0) {
            return null; // 所有实例都不健康
        }
        // 轮询选择

        //Math.abs(nextServerCyclicCounter.getAndIncrement()) 计数的数据
        // reachableServers.size()  服务器总数 3
        int index = Math.abs(nextServerCyclicCounter.getAndIncrement()) % reachableServers.size();
        //  5 % 3 = 2   第三个服务器
        //  6 % 3 = 0   第一个服务器
        //  7 % 3 = 1   第二个服务器
        //  8 % 3 = 2   第三个服务器
        System.out.println(reachableServers.get(index).getHostPort());
        return reachableServers.get(index);
    }

    @Override
    public void setLoadBalancer(ILoadBalancer lb) {
        super.setLoadBalancer(lb);
    }

    @Override
    public ILoadBalancer getLoadBalancer() {
        return super.getLoadBalancer();
    }

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
}

